package com.aaa.cts.service.impl;

import com.aaa.common.constants.ExceptionConstant;
import com.aaa.common.constants.ReturnStatus;
import com.aaa.common.util.CustomException;
import com.aaa.common.util.Result;
import com.aaa.cts.dao.RoleDao;
import com.aaa.cts.entity.Role;
import com.aaa.cts.entity.RoleMenu;
import com.aaa.cts.service.RoleMenuService;
import com.aaa.cts.service.RoleService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 角色信息表(Role)表服务实现类
 *
 * @author makejava
 * @since 2020-12-02 22:52:20
 */
@Service("roleService")
@Transactional
public class RoleServiceImpl implements RoleService {
    @Resource
    private RoleDao roleDao;

    @Resource
    private RoleMenuService roleMenuService;

    /**
     * 通过ID查询单条数据
     *
     * @param roleId 主键
     * @return 实例对象
     */
    @Override
    public Role queryById(Integer roleId) {
        return this.roleDao.queryById(roleId);
    }

    /**
     * 通过实体作为筛选条件查询
     * @param role
     * @return
     */
    @Override
    public Result queryList(Role role) {
        //设置删除状态
        role.setDelFlag("0");
        return new Result(ReturnStatus.SUCCESS.getReturnCode(),
                ReturnStatus.SUCCESS.getReturnMsg(), this.roleDao.queryAll(role));
    }

    /**
     * 通过实体作为筛选条件查询
     *
     * @param pageNo
     * @param pageSize
     * @param role     实例对象
     * @return 对象列表
     */
    @Override
    public Result queryAll(int pageNo, int pageSize, Role role) {
        //设置删除状态
        role.setDelFlag("0");
        PageHelper.startPage(pageNo,pageSize);
        List<Role> roles = this.roleDao.queryAll(role);
        PageInfo<Role> rolePageInfo = new PageInfo<>(roles);
        role.setDelFlag("0");
        return new Result(ReturnStatus.SUCCESS.getReturnCode(),
                ReturnStatus.SUCCESS.getReturnMsg(), rolePageInfo);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public Result queryAllByLimit(int offset, int limit) {
        return new Result(ReturnStatus.SUCCESS.getReturnCode(),
                ReturnStatus.SUCCESS.getReturnMsg(), this.roleDao.queryAllByLimit(offset, limit));
    }

    /**
     * 新增数据
     *
     * @param role 实例对象
     * @return 实例对象
     */
    @Override
    public Result insert(Role role,List<Integer> menus) {
        //设置删除状态
        role.setDelFlag("0");
        if(role.getStatus()==null){
            role.setStatus("1");
        }
        //调用添加角色方法
        int roleAdd = this.roleDao.insert(role);
        if(roleAdd<=0){
            throw new CustomException(ExceptionConstant.UNKOWN_EXCEPTION.getErrorCode(),
                    ExceptionConstant.UNKOWN_EXCEPTION.getErrorMessage());
        }
        if(menus!=null && menus.size()>0){
            //调用转换成RoleMenu对象方法
            List<RoleMenu> roleMenuList = this.getRoleMenuList(role, menus);
            Result result = roleMenuService.insertOrUpdateBatch(roleMenuList);
            if(result.getCode()!=2000){
                throw new CustomException(ExceptionConstant.UNKOWN_EXCEPTION.getErrorCode(),
                        ExceptionConstant.UNKOWN_EXCEPTION.getErrorMessage());
            }
        }
        return new Result(ReturnStatus.SUCCESS.getReturnCode(),
                ReturnStatus.SUCCESS.getReturnMsg());
    }

    /**
     * 转换成RoleMenu对象
     * @param role  角色实例
     * @param menus  权限集合
     * @return  RoleMenu集合
     */
    public List<RoleMenu> getRoleMenuList(Role role,List<Integer> menus){
        List<RoleMenu> roleMenuList=new ArrayList<>();
        for (Integer menu : menus) {
            RoleMenu roleMenu = new RoleMenu();
            roleMenu.setRoleId(role.getRoleId());
            roleMenu.setMenuId(menu);
            roleMenuList.add(roleMenu);
        }
        return roleMenuList;
    }

    /**
     * 修改数据
     *
     * @param role 实例对象
     * @return 实例对象
     */
    @Override
    public Result update(Role role,List<Integer> menus) {
        //调用更新方法
        int update = this.roleDao.update(role);
        if(update<0){
            throw new CustomException(ExceptionConstant.UNKOWN_EXCEPTION.getErrorCode(),
                    ExceptionConstant.UNKOWN_EXCEPTION.getErrorMessage());
        }
        if(menus!=null && menus.size()>0){
            //调用转换成RoleMenu对象方法
            List<RoleMenu> roleMenuList = this.getRoleMenuList(role, menus);
            //更新之前先删除掉之前的
            roleMenuService.deleteById(role.getRoleId());
            Result result = roleMenuService.insertOrUpdateBatch(roleMenuList);
            if(result.getCode()!=2000){
                throw new CustomException(ExceptionConstant.UNKOWN_EXCEPTION.getErrorCode(),
                        ExceptionConstant.UNKOWN_EXCEPTION.getErrorMessage());
            }
        }
        return new Result(ReturnStatus.SUCCESS.getReturnCode(),
                ReturnStatus.SUCCESS.getReturnMsg());
    }

    /**
     * 通过主键删除数据
     *
     * @param roleId 主键
     * @return 是否成功
     */
    @Override
    public Result deleteById(Integer roleId) {
        boolean b = this.roleDao.deleteById(roleId) > 0;
        if(!b){
            throw new CustomException(ExceptionConstant.UNKOWN_EXCEPTION.getErrorCode(),
                    ExceptionConstant.UNKOWN_EXCEPTION.getErrorMessage());
        }
        return new Result(ReturnStatus.SUCCESS.getReturnCode(),
                ReturnStatus.SUCCESS.getReturnMsg(),b);
    }
}